package com.dynabook.ems.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.dynabook.ems.common.BaseResponse;
import com.dynabook.ems.model.dto.*;
import com.dynabook.ems.model.entity.EmsBom;
import com.dynabook.ems.model.vo.BomListVO;
import com.dynabook.ems.model.vo.OptionVO;
import com.dynabook.ems.model.vo.SelectCategoryVO;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.NotBlank;
import java.util.HashMap;
import java.util.List;

/**
* @author tester
* @description 针对表【ems_bom】的数据库操作Service
* @createDate 2025-07-21 15:20:05
*/
public interface EmsBomService extends IService<EmsBom> {
    /**
     * 添加BOM
     * 
     * @param bomAddRequest BOM添加请求
     * @return 操作结果
     */
    BaseResponse<HashMap<String, Boolean>> addBom(BomAddRequest bomAddRequest, HttpServletRequest request);

    /**
     * 生成BOM ID
     * 
     * @return BOM ID
     */
    String generateBomId();

    /**
     * 分页查询BOM列表
     * 
     * @param bomListRequest 查询条件
     * @return 分页结果
     */
    Page<BomListVO> getBomList(BomListRequest bomListRequest);
    
    /**
     * 根据BOMID查询BOM详细信息
     * 
     * @param bomId BOM编号
     * @return BOM详细信息
     */
    BaseResponse getBomDetailById(String bomId);
    
    /**
     * 批量删除BOM
     * 
     * @param bomIds BOM编号列表
     * @return 删除结果
     */
    /**
     * 复制BOM
     * @param bomId 原BOMID
     * @return 复制结果
     */
    BaseResponse<String> copyBom(BomCopyRequest bomCopyRequest, HttpServletRequest request);
    
    /**
     * 批量删除BOM
     * 
     * @param bomIds BOM编号列表
     * @return 删除结果
     */
    /**
     * 批量删除BOM
     * 
     * @param bomIds BOM编号列表
     * @return 删除结果
     */
    BaseResponse<Boolean> deleteBomByIds(BomDeleteRequest bomDeleteRequest);
    
    /**
     * 编辑BOM详情
     * 
     * @param bomEditRequest BOM编辑请求
     * @return 操作结果
     */
    BaseResponse<Boolean> editBom(BomEditRequest bomEditRequest);
    
    /**
     * 根据BOM编号和版本号查询BOM详细信息
     * 
     * @param bomNum BOM编号
     * @param version 版本号
     * @return BOM详细信息
     */
    BaseResponse getBomDetailByNumAndVersion(String bomNum, String version);
    
    /**
     * 根据BOM编号查询版本选项列表
     * 
     * @param bomNum BOM编号
     * @return 版本选项列表
     */
    BaseResponse<List<CategoryOptions>> getVersionOptionsByBomNum(String bomNum);
    
    /**
     * 获取去重的成品型号列表
     * 
     * @return 成品型号选项列表
     */
    BaseResponse<List<CategoryOptions>> getFinishedProductModelOptions();
    
    /**
     * 根据成品型号查询版本选项列表
     * 
     * @param finishedProductModel 成品型号
     * @return 版本选项列表
     */
    BaseResponse<SelectCategoryVO> getVersionOptionsByFinishedProductModel(String finishedProductModel);
    
    /**
     * 根据成品型号和版本号查询BOM详细信息
     * @param finishedProductModel 成品型号
     * @param version 版本号
     * @return BOM详细信息
     */
    BaseResponse getBomDetailByFinishedProductModelAndVersion(String finishedProductModel, String version,String workOrderNumber);

    BaseResponse<List<CategoryOptions>> getTypeOptions();
    
    /**
     * 导出BOM数据
     * 
     * @param bomExportRequest 导出请求参数
     * @param response HTTP响应对象
     */
    void exportBomData(BomExportRequest bomExportRequest, HttpServletResponse response);

    List<OptionVO> getExistProductName(@NotBlank(message = "成品型号前缀不能为空") String productNamePrefix);

    boolean checkExistProductName(@NotBlank(message = "成品型号不能为空") String finishedProductModel);

    BaseResponse<Boolean> beforeAdd(@NotBlank(message = "工单号不能为空") String workOrderNumber);
}
